import { routerMap } from '@/router/async/router.map'
import { mergeI18nFromRoutes } from '@/utils/i18n'

/**
 * 加载路由
 * @param router 应用路由实例
 * @param store 应用的 vuex.store 实例
 * @param i18n 应用的 vue-i18n 实例
 * @param addRoutes 路由配置
 */
function loadRoutes({router, store, i18n}, addRoutes) {
  // 如果开启了异步路由，则加载异步路由配置
  const asyncRoutes = store.state.setting.asyncRoutes
  if (asyncRoutes) {
    if (addRoutes && addRoutes.length > 0) {
      const addData = generator(addRoutes)
      router.options.routes=store.state.user.routers
      router.addRoutes(addData)
    }
  }
  // 提取路由国际化数据
  mergeI18nFromRoutes(i18n, router.options.routes)
  // 初始化Admin后台菜单数据
  const menuRoutes =[]
  router.options.routes.forEach((item) => {
    if(item.path === '/'){
      if (item.children) {
        menuRoutes.push(item.children)
      }
    }
  })
  //const rootRoute = router.options.routes.find(item => item.path === '/')
  //const menuRoutes = rootRoute && rootRoute.children
  if (menuRoutes) {
    store.commit('setting/setMenuData', menuRoutes)
  }
}

/**
 * 格式化树形结构数据 生成 vue-router 层级路由表
 *
 * @param routerList
 * @param parent
 * @returns {*}
 */
function generator (routerList, parent){
  return routerList.map(item => {
    const { title, keepAlive, hideChildrenInMenu, hiddenHeaderContent, funcList, icon,hidden } = item || {}
    const currentRouter = {
      // 如果路由设置了 path，则作为默认 path，否则 路由地址 动态拼接生成如 /dashboard/workplace
      path: item.path || `${parent && parent.path || ''}/${item.key}`,
      // 路由名称，建议唯一
      name: item.name || item.key || '',
      // 该路由对应页面的 组件 :方案1
      // component: constantRouterComponents[item.component || item.key],
      // 该路由对应页面的 组件 :方案2 (动态加载)
      component: (routerMap[item.component || item.key]) || (() => import(`@/pages/${item.component}`)),

      // meta: 页面标题, 菜单图标, 页面权限(供指令权限用，可去掉)
      meta: {
        title: title,
        icon: icon || undefined,
        hiddenHeaderContent: hiddenHeaderContent,
        keepAlive: keepAlive,
        funcList: funcList,
        authority:'*',
        invisible:hidden,
        routerId: item.routerId
      }
    }
    // 是否设置了隐藏菜单
    currentRouter.hidden = hidden
    
    // 是否设置了隐藏子菜单
    currentRouter.hideChildrenInMenu = hideChildrenInMenu
    
    // 为了防止出现后端返回结果不规范，处理有可能出现拼接出两个 反斜杠
    if (!currentRouter.path.startsWith('http')) {
      currentRouter.path = currentRouter.path.replace('//', '/')
    }
    // 重定向
    item.redirect && (currentRouter.redirect = item.redirect)
    // 是否有子菜单，并递归处理
    if (item.children && item.children.length > 0) {
      // Recursion
      currentRouter.children = generator(item.children, currentRouter)
    }
    return currentRouter
  })
}
/**
 * 从路由 path 解析 i18n key
 * @param path
 * @returns {*}
 */
function getI18nKey(path) {
  const keys = path.split('/').filter(item => !item.startsWith(':') && item != '')
  keys.push('name')
  return keys.join('.')
}

/**
 * 加载导航守卫
 * @param guards
 * @param options
 */
function loadGuards(guards, options) {
  const {beforeEach, afterEach} = guards
  const {router} = options
  beforeEach.forEach(guard => {
    if (guard && typeof guard === 'function') {
      router.beforeEach((to, from, next) => guard(to, from, next, options))
    }
  })
  afterEach.forEach(guard => {
    if (guard && typeof guard === 'function') {
      router.afterEach((to, from) => guard(to, from, options))
    }
  })
}

export {generator, loadRoutes, getI18nKey, loadGuards}
